package util

import (
	"context"
	"haodayizhi/global"
	"time"
)

var (
	ctx                context.Context
	tokenExpiration    int
	userInfoExpiration int
)

func init() {
	ctx = context.Background()
}

// 把用户token 存储到redis 中
func SetTokenToRedis(key string, value interface{}) error {
	tokenExpiration = global.Config.Security.TokenExpiration
	global.Rdb.Set(ctx, global.UserTokenKey+key, value, time.Duration(tokenExpiration)*time.Second)
	return nil
}

// 获取用户token
func GetToken(key string) (interface{}, error) {
	// 获取用户token
	if token, err := global.Rdb.Get(ctx, global.UserTokenKey+key).Result(); err == nil {
		return token, nil
	}
	return nil, nil
}

// 获取token 过期时间
func GetTokenExpiration(key string) (float64, error) {
	// 获取用户token 过期时间
	if token, err := global.Rdb.TTL(ctx, global.UserTokenKey+key).Result(); err == nil {

		return token.Seconds(), nil
	}
	return 0, nil
}

// 删除用户token
func DelToken(key string) error {
	global.Rdb.Del(ctx, global.UserTokenKey+key)
	return nil
}

// 存储用户信息
func SetUserInfoToRedis(key string, value interface{}) error {
	userInfoExpiration = global.Config.Cache.Expiration
	global.Rdb.Set(ctx, global.UserInfoKey+key, value, time.Duration(userInfoExpiration)*time.Second)
	return nil
}

// 获取用户信息
// key = email + uuid
func GetUserInfoByUuid(key string) (interface{}, error) {
	if userInfo, err := global.Rdb.Get(ctx, global.UserInfoKey+key).Result(); err == nil {
		return userInfo, nil
	}
	return nil, nil
}

// 删除用户信息
func DelUserInfoByUuid(key string) error {
	global.Rdb.Del(ctx, global.UserInfoKey+key)
	return nil
}

// 获取登录code值
func GetLoginCodeValue(key string) (interface{}, error) {
	if code, err := global.Rdb.Get(ctx, global.LoginCodeKey+key).Result(); err == nil {
		return code, nil
	}
	return nil, nil
}

// 存储登录code值
func SetLoginCodeValueToRedis(key string, value interface{}) error {
	codeExpiresIn := global.Config.Cache.CodeExpiresIn
	global.Rdb.Set(ctx, global.LoginCodeKey+key, value, time.Duration(codeExpiresIn)*time.Second)
	return nil
}

// 删除登录code值
func DelLoginCodeCit(key string) error {
	global.Rdb.Del(ctx, global.LoginCodeKey+key)
	return nil
}

// 获取注册code 值
func GetRegisterCodeValue(key string) (interface{}, error) {
	if code, err := global.Rdb.Get(ctx, global.RegisterCodeKey+key).Result(); err == nil {
		return code, nil
	}
	return nil, nil
}

// 存储注册code 值
func SetRegisterCodeValueToRedis(key string, value interface{}) error {
	codeExpiresIn := global.Config.Cache.CodeExpiresIn
	global.Rdb.Set(ctx, global.RegisterCodeKey+key, value, time.Duration(codeExpiresIn)*time.Second)
	return nil
}

// 删除注册code 值
func DelRegisterCodeCit(key string) error {
	global.Rdb.Del(ctx, global.RegisterCodeKey+key)
	return nil
}

// 储存uuid为set
// 添加 UUID 到 Redis 集合
func AddUUIDToSet(key string, value interface{}) error {
	err := global.Rdb.Set(ctx, global.UuidKey+key, value, time.Duration(tokenExpiration)*time.Second).Err()
	return err
}

// 删除 UUID 从 Redis 集合
func RemoveUUIDFromSet(key string) error {
	err := global.Rdb.Del(ctx, global.UuidKey+key).Err()
	return err
}

// 获取 uuid
func GetUuidValue(key string) (interface{}, error) {
	if uuid, err := global.Rdb.Get(ctx, global.UuidKey+key).Result(); err == nil {
		return uuid, nil
	}
	return nil, nil
}

// 检查 Redis 集合是否包含某个 UUID
func ContainsUUIDIn(key string) (bool, error) {
	result, err := global.Rdb.Get(ctx, global.UuidKey+key).Result()
	if result != "" {
		return true, nil
	}
	return false, err
}
